package com.longrise.android.byjk.plugins.login;

import android.content.Context;
import android.text.TextUtils;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.longrise.LEAP.Base.Objects.EntityBean;
import com.longrise.android.byjk.app.BYJKAppLike;
import com.longrise.android.byjk.common.UrlConstants;
import com.longrise.android.byjk.model.UserInfor;
import com.longrise.common.datasource.remote.LoadDataManager;
import com.longrise.common.utils.PrintLog;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by callxkj on 16/10/17.
 * 定位
 */

public class LocationUtil implements BDLocationListener {

    private static final String TAG = "LocationUtil";
    private static LocationUtil locationUtil;
    private final Context mContext;
    private LocationClient mLocationClient;
    private final int SDK_PERMISSION_REQUEST = 127;

    private LocationUtil(Context context) {
        this.mContext = context;
    }

    public static LocationUtil getInstance(Context context) {
        if (locationUtil == null) {
            locationUtil = new LocationUtil(context);
        }
        return locationUtil;
    }

    /**
     * 上传用户的定位地址
     */
    public void toUploadLocation() {
        mLocationClient = new LocationClient(BYJKAppLike.getAPP().getApplicationContext());
        mLocationClient.registerLocationListener(this);
        initLocation();
        mLocationClient.start();
    }

    private void initLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
        );//可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setCoorType("bd09ll");//可选，默认gcj02，设置返回的定位结果坐标系
        int span = 10000;
        option.setScanSpan(span);//可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可选，设置是否需要地址信息，默认不需要
        option.setOpenGps(true);//可选，默认false,设置是否使用gps
        option.setLocationNotify(true);//可选，默认false，设置是否当GPS有效时按照1S/1次频率输出GPS结果
        option.setIsNeedLocationDescribe(true);//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);//可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.setIgnoreKillProcess(false);//可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        option.SetIgnoreCacheException(false);//可选，默认false，设置是否收集CRASH信息，默认收集
        option.setEnableSimulateGps(false);//可选，默认false，设置是否需要过滤GPS仿真结果，默认需要
        mLocationClient.setLocOption(option);
    }


    @Override
    public void onReceiveLocation(BDLocation bdLocation) {
        String time = bdLocation.getTime(); //时间
        double latitude = bdLocation.getLatitude(); //纬度
        double longitude = bdLocation.getLongitude(); //经度
        int locType = bdLocation.getLocType();
        if (61 == locType || 161 == locType || 65 == locType || 66 == locType) {
            toUpload(latitude, longitude);
        } else {
            //增加谷歌分析 上传地理位置失败 把locType也带上
        }
        PrintLog.e(TAG, "time:" + time + "\n" + "latitude:" + latitude + "\n" + "longitude:" + longitude
                + "\n" + "locType:" + locType);
        if (TextUtils.isEmpty(time)) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date(System.currentTimeMillis());
            time = dateFormat.format(date);
            PrintLog.d(TAG, "time:" + time);
        }
        mLocationClient.stop();
    }

    @Override
    public void onConnectHotSpotMessage(String s, int i) {

    }

    private void toUpload(double latitude, double longitude) {
        String userid = UserInfor.getInstance().getUserid();
        String isRealCardNo = UserInfor.getInstance().getIsRealCardNo();
        if("0".equals(isRealCardNo)){
              return;
        }
        String usersfzh = UserInfor.getInstance().getUsersfzh();
        EntityBean bean = new EntityBean();
        bean.set("userid", userid);
        bean.set("longitude", longitude);
        bean.set("latitude", latitude);
        bean.set("cardno",usersfzh);
        EntityBean fbean = new EntityBean();
        fbean.set("bean", bean);
        LoadDataManager.getInstance().callService("", UrlConstants.BaseUrl, "bbt_user_uPersonGps", fbean, new LoadDataManager.OnRequestCallListener() {
            @Override
            public void onSuccess(String key, String service, Object result) {
                try {
                    EntityBean bean = (EntityBean) result;
                    PrintLog.d(TAG, "bean:" + bean.toString());
                    Boolean resultresult = bean.getBoolean("result");
                    if (resultresult) {
                        //增加谷歌分析 上传地理位置成功
                    } else {
                        //增加谷歌分析 上传地理位置失败
                    }
                } catch (Exception e) {
                    //增加谷歌分析 上传地理位置失败
                }
            }

            @Override
            public void onError(String key, String service, Throwable ex, boolean isOnCallback) {
                //增加谷歌分析 上传地理位置失败
            }

            @Override
            public void onFinished(String key, String service) {

            }
        });
    }

}


//        61 ： GPS定位结果，GPS定位成功。
//        62 ： 无法获取有效定位依据，定位失败，请检查运营商网络或者WiFi网络是否正常开启，尝试重新请求定位。
//        63 ： 网络异常，没有成功向服务器发起请求，请确认当前测试手机网络是否通畅，尝试重新请求定位。
//        65 ： 定位缓存的结果。
//        66 ： 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果。
//        67 ： 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果。
//        68 ： 网络连接失败时，查找本地离线定位时对应的返回结果。
//        161： 网络定位结果，网络定位成功。
//        162： 请求串密文解析失败，一般是由于客户端SO文件加载失败造成，请严格参照开发指南或demo开发，放入对应SO文件。
//        167： 服务端定位失败，请您检查是否禁用获取位置信息权限，尝试重新请求定位。
//        502： AK参数错误，请按照说明文档重新申请AK。
//        505：AK不存在或者非法，请按照说明文档重新申请AK。
//        601： AK服务被开发者自己禁用，请按照说明文档重新申请AK。
//        602： key mcode不匹配，您的AK配置过程中安全码设置有问题，请确保：SHA1正确，“;”分号是英文状态；且包名是您当前运行应用的包名，请按照说明文档重新申请AK。
//        501～700：AK验证失败，请按照说明文档重新申请AK。